package com.gitee.helioz.openai.api;

import com.gitee.helioz.openai.api.endpoint.audio.AudioService;
import com.gitee.helioz.openai.api.endpoint.chat.ChatService;
import com.gitee.helioz.openai.api.endpoint.completions.CompletionService;
import com.gitee.helioz.openai.api.endpoint.edits.EditService;
import com.gitee.helioz.openai.api.endpoint.embeddings.EmbeddingService;
import com.gitee.helioz.openai.api.endpoint.files.FileService;
import com.gitee.helioz.openai.api.endpoint.finetunes.FineTuneService;
import com.gitee.helioz.openai.api.endpoint.images.ImageService;
import com.gitee.helioz.openai.api.endpoint.models.ModelsService;
import com.gitee.helioz.openai.api.endpoint.moderations.ModerationService;
import com.gitee.helioz.openai.common.authentication.AuthenticationConfigDTO;
import com.gitee.helioz.openai.common.util.http.HttpService;

import java.util.Map;

/**
 * 〈openai api service〉
 *
 * @author <a href="https://gitee.com/helioz">Morning Starr</a>
 */
public interface OpenAiService extends HttpService {

    /**
     * 获取当前使用中的api key
     *
     * @return 当前使用中的api key
     */
    AuthenticationConfigDTO getAuthConfig();

    /**
     * 注入多个 {@link AuthenticationConfigDTO}
     *
     * @param authConfigs AuthenticationConfiguration map
     */
    void setMultiAuthConfigs(Map<String, AuthenticationConfigDTO> authConfigs);

    /**
     * 注入多个 {@link AuthenticationConfigDTO}
     *
     * @param authConfigs   AuthenticationConfiguration map
     * @param defaultApiKey 设置一个默认的{@link AuthenticationConfigDTO}
     */
    void setMultiAuthConfigs(Map<String, AuthenticationConfigDTO> authConfigs, String defaultApiKey);

    /**
     * Map里 加入新的 {@link AuthenticationConfigDTO}，适用于动态添加新的api key.
     *
     * @param apiKey     api key
     * @param authConfig 配置信息
     */
    void addAuthConfig(String apiKey, AuthenticationConfigDTO authConfig);

    /**
     * 从 Map中 移除 {@link String apiKey} 所对应的 {@link AuthenticationConfigDTO}，适用于动态移除api key.
     *
     * @param apiKey api key
     */
    void removeAuthConfig(String apiKey);


    /**
     * 进行相应的API KEY切换
     *
     * @param apiKey API KEY
     * @return 切换是否成功 boolean
     */
    boolean switchover(String apiKey);

    /**
     * 进行相应的API KEY切换
     *
     * @param apiKey API KEY
     * @return 切换成功 ，则返回当前对象，方便链式调用，否则抛出异常
     */
    OpenAiService switchoverTo(String apiKey);

    /**
     * 自定义API域名
     *
     * @param apiHost API域名
     */
    void setApiHost(String apiHost);

    /**
     * 获取自定义API域名
     *
     * @return API域名
     */
    String getApiHost();

    /**
     * 获取模型服务实例。
     *
     * @return 模型服务实例
     */
    ModelsService getModelsService();

    /**
     * 获取文本补全服务实例。
     *
     * @return 文本补全服务实例
     */
    CompletionService getCompletionService();

    /**
     * 获取聊天完成服务实例。
     *
     * @return 聊天完成服务实例
     */
    ChatService getChatService();

    /**
     * 获取文本编辑服务实例。
     *
     * @return 文本编辑服务实例
     */
    EditService getEditService();

    /**
     * 获取图像服务实例。
     *
     * @return 图像服务实例
     */
    ImageService getImageService();

    /**
     * 获取嵌入服务实例。
     *
     * @return 嵌入服务实例
     */
    EmbeddingService getEmbeddingService();

    /**
     * 获取音频服务实例。
     *
     * @return 音频服务实例
     */
    AudioService getAudioService();

    /**
     * 获取文件服务实例。
     *
     * @return 文件服务实例
     */
    FileService getFileService();

    /**
     * 获取微调服务实例。
     *
     * @return 微调服务实例
     */
    FineTuneService getFineTuneService();

    /**
     * 获取内容过滤服务实例。
     *
     * @return 内容过滤服务实例
     */
    ModerationService getModerationService();

}
